package com.xuzimian.globaldemo.spring.springmvc.filter;

import javax.servlet.*;
import java.io.IOException;

/**
 * Filter : 是实现了javax.servlet.Filter接口的服务器端程序,有一下几个主要功能：
 * 在HttpServletRequest到达Servlet之前，拦截客户的HttpServletRequest。
 * 根据需要检查HttpServletRequest，也可以修改HttpServletRequest头和数据。
 * 在HttpServletResponse到达客户端之前，拦截HttpServletResponse。
 * 根据需要检查HttpServletResponse，也可以修改HttpServletResponse头和数据。
 *
 * Interceptor: 拦截器是在面向切面编程中应用的，就是在你的service或者一个方法前调用一个方法，
 * 或者在方法后调用一个方法。是基于JAVA的反射机制。拦截器不是在web.xml
 *
 * Filter和Interceptor的区别
 * Filter是基于函数回调（doFilter()方法）的，而Interceptor则是基于Java反射的（AOP思想）。
 * Filter依赖于Servlet容器，而Interceptor不依赖于Servlet容器。
 * Filter对几乎所有的请求起作用，而Interceptor只能对action请求起作用。
 * Interceptor可以访问Action的上下文，值栈里的对象，而Filter不能。
 * 在action的生命周期里，Interceptor可以被多次调用，而Filter只能在容器初始化时调用一次。
 *
 * Filter和Interceptor的执行顺序 :   过滤前-拦截前-action执行-拦截后-过滤后
 *
 * @author xzm
 */
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("这是MyFilter init方法提交");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("这是MyFilter doFilter方法提交");
        filterChain.doFilter(servletRequest, servletResponse);
        return;

    }

    @Override
    public void destroy() {
        System.out.println("这是MyFilter destroy方法提交");
    }
}
